{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scSHARP.sc_sharp import scSHARP\n",
    "from scSHARP.grid_search import GridSearch\n",
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_path = \"simulations/splat_0.7/query_counts.csv.gz\"\n",
    "preds_path = \"simulations/splat_0.7/preds.csv\"\n",
    "tool_list = [\"scina\", \"scsorter\", \"sctype\", \"scpred\", \"singler\"]\n",
    "marker_path = \"simulations/splat_0.7/markers.txt\"\n",
    "ref_path = 'simulations/splat_0.7/ref_counts.csv.gz'\n",
    "ref_label_path = 'simulations/splat_0.7/ref_labels.csv'\n",
    "neighbors=2\n",
    "config=\"configs/2_25.txt\"\n",
    "sharp = scSHARP(data_path, tool_list, marker_path, preds_path=preds_path, config=config)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "gs = GridSearch(sharp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt', 35, 10, 0.0, 20, <scSHARP.sc_sharp.scSHARP object at 0x7ff2d57a94f0>), ('/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_25.txt', 35, 10, 0.0, 20, <scSHARP.sc_sharp.scSHARP object at 0x7ff2d57a94f0>)]\n",
      "[('/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt', 20, 10, 0.0, 20, <scSHARP.sc_sharp.scSHARP object at 0x7fef897aa4f0>), ('/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_25.txt', 20, 10, 0.0, 20, <scSHARP.sc_sharp.scSHARP object at 0x7fef897aa4f0>)]\n",
      "[('/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt', 35, 50, 0.0, 20, <scSHARP.sc_sharp.scSHARP object at 0x7fb7e9faa4f0>), ('/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_25.txt', 35, 50, 0.0, 20, <scSHARP.sc_sharp.scSHARP object at 0x7fb7e9faa4f0>)]\n",
      "[('/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt', 20, 50, 0.0, 20, <scSHARP.sc_sharp.scSHARP object at 0x7f8fdffaa4f0>), ('/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_25.txt', 20, 50, 0.0, 20, <scSHARP.sc_sharp.scSHARP object at 0x7f8fdffaa4f0>)]\n",
      "DEBUG: total_acc: 0.9549999833106995, val_acc: 0.9430052042007446, test_acc: 0.0, best_acc: 0\n",
      "DEBUG: total_acc: 0.9440000057220459, val_acc: 0.9015544056892395, test_acc: 0.0, best_acc: 0\n",
      "DEBUG: total_acc: 0.9380000233650208, val_acc: 0.8963730335235596, test_acc: 0.0, best_acc: 0\n",
      "DEBUG: total_acc: 0.9480000138282776, val_acc: 0.9067357778549194, test_acc: 0.0, best_acc: 0\n",
      "DEBUG: total_acc: 0.9470000267028809, val_acc: 0.9015544056892395, test_acc: 0.0, best_acc: 0.9430052042007446\n",
      "DEBUG: total_acc: 0.8830000162124634, val_acc: 0.787564754486084, test_acc: 0.0, best_acc: 0.9015544056892395\n",
      "DEBUG: total_acc: 0.9470000267028809, val_acc: 0.9015544056892395, test_acc: 0.0, best_acc: 0.8963730335235596\n",
      "DEBUG: total_acc: 0.9359999895095825, val_acc: 0.8652849793434143, test_acc: 0.0, best_acc: 0.9067357778549194\n",
      "[(0.9015544056892395, {'config': '/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt', 'batch_size': 20, 'neighbors': 10, 'dropout': 0.0}), (0.9015544056892395, {'config': '/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_25.txt', 'batch_size': 20, 'neighbors': 50, 'dropout': 0.0}), (0.9430052042007446, {'config': '/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt', 'batch_size': 35, 'neighbors': 10, 'dropout': 0.0}), (0.9067357778549194, {'config': '/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt', 'batch_size': 35, 'neighbors': 50, 'dropout': 0.0})]\n",
      "filtered results: [(0.9015544056892395, {'config': '/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt', 'batch_size': 20, 'neighbors': 10, 'dropout': 0.0}), (0.9015544056892395, {'config': '/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_25.txt', 'batch_size': 20, 'neighbors': 50, 'dropout': 0.0}), (0.9430052042007446, {'config': '/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt', 'batch_size': 35, 'neighbors': 10, 'dropout': 0.0}), (0.9067357778549194, {'config': '/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt', 'batch_size': 35, 'neighbors': 50, 'dropout': 0.0})]\n"
     ]
    }
   ],
   "source": [
    "# small search\n",
    "configs = ['/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt', '/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_25.txt']\n",
    "batch_size=[20, 35]\n",
    "neighbors=[10, 50]\n",
    "dropouts=[0.0]\n",
    "\n",
    "# really small search\n",
    "# configs = ['/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt']\n",
    "# batch_size=[20]\n",
    "# neighbors=[10]\n",
    "# dropouts=[0.0]\n",
    "\n",
    "gs_output = gs.model_grid_search(n_workers=4, random_inits=1, configs=configs, batch_size=batch_size, neighbors=neighbors, dropouts=dropouts, training_epochs=20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(0.9430052042007446,\n",
       "  {'config': '/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt',\n",
       "   'batch_size': 35,\n",
       "   'neighbors': 10,\n",
       "   'dropout': 0.0}),\n",
       " (0.9067357778549194,\n",
       "  {'config': '/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt',\n",
       "   'batch_size': 35,\n",
       "   'neighbors': 50,\n",
       "   'dropout': 0.0}),\n",
       " (0.9015544056892395,\n",
       "  {'config': '/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_25.txt',\n",
       "   'batch_size': 20,\n",
       "   'neighbors': 50,\n",
       "   'dropout': 0.0}),\n",
       " (0.9015544056892395,\n",
       "  {'config': '/Users/maxperozek/CP499/scSHARP_tool/scSHARP/configs/2_15.txt',\n",
       "   'batch_size': 20,\n",
       "   'neighbors': 10,\n",
       "   'dropout': 0.0})]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(gs_output)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loss in epoch 0 = 57.780670\n",
      "Loss in epoch 10 = 0.056038\n",
      "Loss in epoch 20 = 0.013589\n",
      "tensor([0, 0, 2, 0, 3, 3, 1, 2, 1, 2])\n",
      "tensor([1.0000, 1.0000, 0.9998, 1.0000, 1.0000, 0.9999, 1.0000, 0.9999, 1.0000,\n",
      "        1.0000], grad_fn=<SliceBackward0>)\n"
     ]
    }
   ],
   "source": [
    "preds, train_nodes, test_nodes, keep_cells, conf_scores = sharp.run_prediction(training_epochs=30, thresh=0.51, batch_size=20, seed=8)\n",
    "print(preds[0:10])\n",
    "print(conf_scores[0:10])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "sharp.save_model('/Users/maxperozek/Desktop/example_model')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "sharp.load_model('/Users/maxperozek/Desktop/example_model')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/maxperozek/CP499/scSHARP_tool/scSHARP/utilities.py:364: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
      "  dataset  = torch.utils.data.TensorDataset(torch.tensor(counts), torch.tensor(preds))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "kNN iter: 10\n",
      "kNN iter: 20\n",
      "kNN iter: 30\n",
      "kNN iter: 40\n",
      "kNN iter: 50\n"
     ]
    }
   ],
   "source": [
    "consensus_preds = sharp.knn_consensus()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1000,)\n",
      "[0. 0. 1. 0. 3. 3. 1. 3. 1. 2.]\n",
      "[-1.  0.  1.  2.  3.]\n",
      "1\n"
     ]
    }
   ],
   "source": [
    "print(consensus_preds.shape)\n",
    "print(consensus_preds[:10])\n",
    "print(np.unique(consensus_preds))\n",
    "print(len(np.where(consensus_preds == -1))) # assuming that -1 is some kind of error"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/maxperozek/opt/anaconda3/envs/thesis/lib/python3.9/site-packages/captum/_utils/gradient.py:57: UserWarning: Input Tensor 0 did not already require gradients, required_grads has been set automatically.\n",
      "  warnings.warn(\n",
      "/Users/maxperozek/opt/anaconda3/envs/thesis/lib/python3.9/site-packages/captum/attr/_core/deep_lift.py:336: UserWarning: Setting forward, backward hooks and attributes on non-linear\n",
      "               activations. The hooks and attributes will be removed\n",
      "            after the attribution is finished\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "int_df = sharp.run_interpretation()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:xlabel='Cell Type'>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sharp.heat_map(int_df, n=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 538.128x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sharp.expression_plots(genes=['Gene28271'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.9.7 ('thesis')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "1602471d9f8ed18664a5a568808ad6b32d5ac9c03cbc394cc7452913339cabc4"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
